/*
 * Fichier : Partie_PFC.java
 * Version : 1.0.0
 * Auteurs : Alexandre BOURSIER & Nolan POTIER
 * 
 * Description : Classe modélisant le comportement d'une partie "pierre-feuille-ciseaux"
 */
package club.jeux.session;
import club.jeux.common.Choix_PFC;
import club.jeux.common.Jeu_PFC;
import club.jeux.common.Manche_PFC;
import club.jeux.common.Resultat_PFC;
import club.jeux.persistence.Joueur;
import java.util.Random;
import javax.ejb.Stateful;

@Stateful
public class Partie_PFC implements Partie_PFC_Local {

    // Définir un nombre de manches gagnantes pour la partie
    private final int NOMBRE_DE_MANCHES_GAGNANTES = 3;

    // Calculer el score du joueur
    private int score_joueur;
    
    // Calculer le score de la machine
    private int score_ordinateur;
    
    // Renseigner le numéro de manche courant
    private int numero_manche;
    
    // Définir le joueur cible
    private Joueur joueur;
        
    /**
     * Initialiser la partie
     */
    @Override
    public void init() {
        score_joueur=0;
        score_ordinateur=0;
        numero_manche=0;
    }
    
    
    /**
     * @return le score du joueur
     */
    @Override
    public int getScoreJoueur() {
        return score_joueur;
    }

    /**
     * Modifier le score du joueur
     * @param s le nouveau score
     */
    @Override
    public void setScoreJoueur(int s) {
        score_joueur = s;
    }

    /**
     * @return le score de l'ordinateur
     */
    @Override
    public int getScoreOrdinateur() {
        return score_ordinateur;
    }

    /**
     * Modifier le score de l'ordinateur
     * @param s le nouveau score
     */
    @Override
    public void setScoreOrdinateur(int s) {
        score_ordinateur = s;
    }

    /**
     * @return le numéro de manche
     */
    @Override
    public int getNumeroManche() {
        return numero_manche;
    }

    /**
     * @return le joueur courant 
     */
    @Override
    public Joueur getJoueur() {
        return joueur;
    }

    /**
     * Modifier le joueur cible
     * @param j le nouveau joueur
     */
    @Override
    public void setJoueur(Joueur j) {
        joueur = j;
    }

    /**
     * Simuler une manche de la martie
     * @param c le choix du joueur
     * @return le résultat du point de vue joueur
     */
    @Override
    public Resultat_PFC manche(Choix_PFC c) {
        numero_manche++;
        Random r = new Random();
        Choix_PFC o = Choix_PFC.values()[r.nextInt(3)];
        Manche_PFC current = new Manche_PFC(c, o);
        Jeu_PFC.getInstance().jouer(current);
        
        if(current.getResultat().equals(Resultat_PFC.VICTOIRE)){
            score_joueur++;
        }
        else if(current.getResultat().equals(Resultat_PFC.DEFAITE)){
            score_ordinateur++;
        }
        return current.getResultat();  
    }

    /**
     * Traiter la fin de partie
     */
    @Override
    public void finPartie() {
        if(score_joueur == NOMBRE_DE_MANCHES_GAGNANTES){
            joueur.ajouterPartie(Resultat_PFC.VICTOIRE);
        } else {
            joueur.ajouterPartie(Resultat_PFC.DEFAITE);
        }
    }

    /**
     * Vérifier si la partie est finie
     * @return true si la partie est finie, false sinon
     */
    @Override
    public boolean estFini() {
       if ((score_joueur == NOMBRE_DE_MANCHES_GAGNANTES)||(score_ordinateur == NOMBRE_DE_MANCHES_GAGNANTES)) {
            finPartie();
            return true;
       }
       return false;
    }

    /**
     * @return le nombre de manches gagnantes défini pour une partie
     */
    @Override
    public int getNombreDeManchesgGagnantes() {
        return NOMBRE_DE_MANCHES_GAGNANTES;
    }
    
}
